package io.FileStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TEST1 {
    /*
    字节流和字符流使用的场景
    字节流：拷贝任意文件
    字符流：读取纯文本文件的数据，向纯文本文件中写出数据
     */
//                      拷贝文件夹


    public static void main(String[] args) throws IOException {
//        拷贝一个文件夹，考虑子文件夹
//        创建对象表示数据源
        File src=new File("D:\\IDEA\\untitled\\src");
//       创建对象表示目的地
        File dest=new File("D:\\IDEA\\untitled\\dest");
//        调用方法开始拷贝
        copydir(src,dest);
    }

    /*
    该方法的作用：拷贝文件夹
    参数一：数据源
    参数二：目的地
     */
    private static void copydir(File src, File dest) throws IOException {
//        判断dest是否存在
        dest.mkdirs();//创建文件

//

//        采用递归的方法
//        1.进入数据源，
//        该方式会将src路径下的文件和文件夹放到数组中返回
/*        对于带有权限的文件夹的拷贝该方式会返回null。那么对该行进行一个非空判断就可以进行，
            即非空进行下面操作，空值则打印该文件夹用户没有权限进行操作
        */
        File[] files=src.listFiles();
//        2.遍历数组
//        file则是代表着src路径下的文件或者是文件夹
        for (File file : files) {
            if (file.isFile()){
//                file.isFile() -->文件形式
//        3.判断文件，拷贝
//                如果是文件，则选择拷贝，字节流用于拷贝
//                注意：拷贝要从文件开始，也要从文件结束，而不是文件夹
                FileInputStream fis=new FileInputStream(file);//()填入要拷贝的文件即 file
                FileOutputStream fos=new FileOutputStream(new File(dest,file.getName()));//()填入要拷贝的文件地址
                int len;
                byte[] bytes=new byte[1024*1024];
                while ((len=fis.read(bytes))!=-1){
                    fos.write(bytes,0,len);
                }
//               释放资源：注意先开的后关
                fos.close();
                fis.close();

            }else {
//        4.判断文件夹，递归
//                如果不是文件，则选择递归
                copydir(file,new File(dest,file.getName()));
            }
        }


    }
}
